home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / dev / moni / systemviewer.lha / Priority.c < prev    next >
C/C++ Source or Header  |  2000-09-25  |  16KB  |  669 lines

  1. /****h *Priority/Priority.c *******************************************
  2. **
  3. ** NAME
  4. **    Priority.c
  5. **
  6. ** DESCRIPTION
  7. **    Change the priority of a given system object.
  8. **
  9. ** FUNCTIONAL INTERFACE:
  10. **    PUBLIC int ChangePriorityHandler( char *name, 
  11. **                                      int ObjType,
  12. **                                      int frompri 
  13. **                                    );
  14. **
  15. ***********************************************************************
  16. */
  17.  
  18. #include <string.h>
  19.  
  20. #include <exec/types.h>
  21. #include <exec/nodes.h>
  22. #include <exec/devices.h>
  23. #include <exec/resident.h>
  24. #include <exec/execbase.h>
  25.  
  26. #include <intuition/intuition.h>
  27. #include <intuition/classes.h>
  28. #include <intuition/classusr.h>
  29. #include <intuition/gadgetclass.h>
  30.  
  31. #include <libraries/gadtools.h>
  32.  
  33. #include <graphics/displayinfo.h>
  34. #include <graphics/gfxbase.h>
  35.  
  36. #include <clib/exec_protos.h>
  37. #include <clib/intuition_protos.h>
  38. #include <clib/gadtools_protos.h>
  39. #include <clib/graphics_protos.h>
  40. #include <clib/diskfont_protos.h>
  41.  
  42. #include "SysLists.h"
  43.  
  44. #include "CPGM:GlobalObjects/CommonFuncs.h"
  45.  
  46. #define IntBfPtr( g ) (((struct StringInfo *)g->SpecialInfo)->LongInt)
  47.  
  48. #define ObjNameTxt  0
  49. #define FromPriNum  1
  50. #define ToPriInt    2
  51. #define OkayBt      3
  52. #define CancelBt    4
  53.  
  54. #define PRIORITYGADGET PrGadgets[ ToPriInt ]
  55.  
  56. #define TO_PRIORITY    IntBfPtr( PrGadgets[ ToPriInt ] )
  57.  
  58. #define Pr_CNT      5
  59.  
  60. // -------- See SysCommon.c file: --------------------------------
  61. IMPORT int  SetupSystemList( int (*OpenWindowFunc)( void ) );
  62. IMPORT void ShutdownSystemList( void );
  63.  
  64. // ---------------------------------------------------------------
  65.  
  66. IMPORT struct TextAttr *Font;
  67. IMPORT struct ExecBase *SysBase;
  68.  
  69. // ---------------------------------------------------------------
  70.  
  71. PRIVATE struct TextFont *PrFont        = NULL;
  72.  
  73. PRIVATE struct Window         *PrWnd   = NULL;
  74. PRIVATE struct Gadget         *PrGList = NULL;
  75. PRIVATE struct IntuiMessage    PrMsg;
  76. PRIVATE struct Gadget         *PrGadgets[ Pr_CNT ];
  77.  
  78. PRIVATE UWORD  PrLeft   = 70;
  79. PRIVATE UWORD  PrTop    = 32;
  80. PRIVATE UWORD  PrWidth  = 475;
  81. PRIVATE UWORD  PrHeight = 115;
  82. PRIVATE UBYTE *PrWdt    = (UBYTE *) "Priority Changer:";
  83.  
  84. PRIVATE int   ObjectType  = 0; // described by NT_DEVICE, NT_LIBRARY, etc.
  85. PRIVATE int   NewPriority = 0;
  86. PRIVATE char *Object_Name = NULL;
  87.  
  88. PRIVATE struct IntuiText PrIText[1] = {
  89.    
  90.    2, 0, JAM1,235, 12, NULL, 
  91.    (UBYTE *) "DANGER!  Know what you're doing!", NULL 
  92. };
  93.  
  94. PRIVATE UWORD PrGTypes[] = {
  95.  
  96.    TEXT_KIND,   NUMBER_KIND, INTEGER_KIND,
  97.    BUTTON_KIND, BUTTON_KIND
  98. };
  99.  
  100. PRIVATE int ToPriIntClicked( void );
  101. PRIVATE int OkayBtClicked(   void );
  102. PRIVATE int CancelBtClicked( void );
  103.  
  104. PRIVATE struct NewGadget PrNGad[] = {
  105.  
  106.     70, 40, 350, 17, (UBYTE *) "Change Priority of: ", NULL, ObjNameTxt, 
  107.   PLACETEXT_ABOVE, NULL, NULL,
  108.   
  109.     70, 64,  50, 17, (UBYTE *) "From:",                NULL, FromPriNum, 
  110.    PLACETEXT_LEFT, NULL, NULL,
  111.    
  112.    370, 64,  50, 17, (UBYTE *) "To:",                  NULL, ToPriInt, 
  113.    PLACETEXT_LEFT, NULL, (APTR) ToPriIntClicked,
  114.  
  115.     70, 90, 120, 17, (UBYTE *) "CHANGE IT!",           NULL, OkayBt, 
  116.    PLACETEXT_IN, NULL, (APTR) OkayBtClicked,
  117.  
  118.    350, 90,  70, 17, (UBYTE *) "_CANCEL",              NULL, CancelBt, 
  119.    PLACETEXT_IN, NULL, (APTR) CancelBtClicked
  120. };
  121.  
  122. PRIVATE ULONG PrGTags[] = {
  123.  
  124.    (GTTX_Border), TRUE, (TAG_DONE),  // Object Name.
  125.    (GTNM_Border), TRUE, (TAG_DONE),  // From Priority.
  126.  
  127.    (GA_TabCycle), FALSE, (GTIN_Number), 0, // To Priority Integer.
  128.    (GTIN_MaxChars), 10, 
  129.    (STRINGA_Justification), (GACT_STRINGCENTER), (TAG_DONE),
  130.  
  131.    (TAG_DONE),                      // Okay button.
  132.    (GT_Underscore), '_', (TAG_DONE) // Cancel button.
  133. };
  134.  
  135. // -------------------------------------------------------------------
  136.  
  137. PRIVATE void ClosePrWindow( void )
  138. {
  139.    if (PrWnd != NULL) 
  140.       {
  141.       CloseWindow( PrWnd );
  142.       PrWnd = NULL;
  143.       }
  144.  
  145.    if (PrGList != NULL) 
  146.       {
  147.       FreeGadgets( PrGList );
  148.       PrGList = NULL;
  149.       }
  150.  
  151.    if (PrFont != NULL) 
  152.       {
  153.       CloseFont( PrFont );
  154.       PrFont = NULL;
  155.       }
  156.  
  157.    return;
  158. }
  159.  
  160. PRIVATE void *FindNamedNode( struct Node *node, char *name )
  161. {
  162.    void *rval = NULL;
  163.  
  164.    while (node != NULL)
  165.       {
  166.       if (strcmp( node->ln_Name, name ) == 0)
  167.          {
  168.          rval = (void *) node;
  169.          break;
  170.          }
  171.               
  172.       node = node->ln_Succ;  
  173.       }
  174.  
  175.    return( rval );   
  176. }
  177.  
  178. PRIVATE void *GetNodePtr( int objtype )
  179. {
  180.    struct List *DevListPtr = NULL;
  181.    struct Node *ptr        = NULL;
  182.  
  183.    void *rval = NULL;
  184.  
  185.    if (strlen( Object_Name ) < 1)
  186.       {
  187.       UserInfo( "No name given to GetNodePtr()!", "Program ERROR:" );
  188.  
  189.       return( rval );
  190.       }
  191.  
  192.    switch (objtype)
  193.       {
  194.       case NT_DEVICE:
  195.          {
  196.          struct Device *d = NULL;
  197.  
  198.          Forbid();         
  199.  
  200.             DevListPtr = &SysBase->DeviceList;
  201.             ptr        = DevListPtr->lh_Head;
  202.             d          = (struct Device  *) ptr;
  203.  
  204.             while (d != NULL)
  205.                {
  206.                if (strcmp( d->dd_Library.lib_Node.ln_Name, 
  207.                            Object_Name ) == 0)
  208.                   {
  209.                   rval = (void *) (&(d->dd_Library.lib_Node));
  210.                   break;
  211.                   }
  212.                
  213.                d = (struct Device *) d->dd_Library.lib_Node.ln_Succ;  
  214.                }
  215.                
  216.          Permit();
  217.          }
  218.          break;
  219.  
  220.       case NT_LIBRARY:
  221.          {
  222.          struct Library *d;
  223.          
  224.          Forbid();         
  225.  
  226.             DevListPtr = &SysBase->LibList;
  227.             ptr        = DevListPtr->lh_Head;
  228.             d          = (struct Library *) ptr;
  229.  
  230.             rval       = FindNamedNode( &(d->lib_Node), Object_Name );
  231.                
  232.          Permit();
  233.          }
  234.          break;
  235.  
  236.       case NT_RESOURCE:
  237.          {
  238.          struct Library *d;
  239.          
  240.          Forbid();         
  241.  
  242.             DevListPtr = &SysBase->ResourceList;
  243.             ptr        = DevListPtr->lh_Head;
  244.             d          = (struct Library *) ptr;
  245.  
  246.             rval       = FindNamedNode( &(d->lib_Node), Object_Name );
  247.                
  248.          Permit();
  249.          }
  250.          break;
  251.  
  252.       case NT_MEMORY:
  253.          {
  254.          struct Node *d = NULL;
  255.          
  256.          Forbid();         
  257.  
  258.             DevListPtr = &SysBase->LibList;
  259.             d          = DevListPtr->lh_Head;
  260.  
  261.             rval       = FindNamedNode( d, Object_Name );
  262.                
  263.          Permit();
  264.          }
  265.          break;
  266.  
  267.       case NT_TASK:
  268.       case NT_PROCESS:
  269.          {
  270.          struct Task *d = SysBase->ThisTask;
  271.  
  272.          Forbid();         
  273.  
  274.             rval = FindNamedNode( &(d->tc_Node), Object_Name );
  275.                
  276.          Permit();
  277.          }
  278.          break;
  279.  
  280.       case NT_INTERRUPT:
  281.          {
  282.          struct Node *d = NULL;
  283.          
  284.          Forbid();         
  285.  
  286.             DevListPtr = &SysBase->IntrList;
  287.             d          = DevListPtr->lh_Head;
  288.  
  289.             rval       = FindNamedNode( d, Object_Name );
  290.                
  291.          Permit();
  292.          }
  293.          break;
  294.  
  295.       case NT_MSGPORT:
  296.          {
  297.          struct Node *d = NULL;
  298.          
  299.          Forbid();         
  300.  
  301.             DevListPtr = &SysBase->PortList;
  302.             d          = DevListPtr->lh_Head;
  303.  
  304.             rval       = FindNamedNode( d, Object_Name );
  305.                
  306.          Permit();
  307.          }
  308.          break;
  309.  
  310.       default:
  311.          {
  312.          // struct Resident looks like a Library ROMTag:
  313.          struct Resident *d = SysBase->ResModules;
  314.          
  315.          Forbid();         
  316.  
  317.             while (d != NULL)
  318.                {
  319.                if (strcmp( d->rt_Name, Object_Name ) == 0) // rt_IdString??
  320.                   {
  321.                   // Residents are other types of system objects:
  322.  
  323.                   rval = GetNodePtr( d->rt_Type ); // Recursion!!
  324.                   break;
  325.                   }
  326.                
  327.                d++;
  328.                }
  329.  
  330.          Permit();
  331.          }
  332.          break;
  333.       }
  334.  
  335.    return( rval );
  336. }
  337.  
  338. PRIVATE int ToPriIntClicked( void )
  339. {
  340.    NewPriority = IntBfPtr( PRIORITYGADGET );
  341.  
  342.    return( (int) TRUE );
  343. }
  344.  
  345. PRIVATE int OkayBtClicked( void )
  346. {
  347.    struct Node *node = (struct Node *) GetNodePtr( ObjectType );
  348.  
  349.    struct Node  savednode = { 0, };
  350.  
  351.     
  352.    if (node == NULL)
  353.       {
  354.       sprintf( ErrMsg, "Couldn't find %s in System Lists!", Object_Name );
  355.  
  356.       UserInfo( ErrMsg, "User ERROR?" );
  357.       
  358.       return( (int) TRUE );
  359.       }
  360.  
  361.    CopyMem( node, (APTR) &savednode, (long) sizeof( struct Node ) );
  362.  
  363.    savednode.ln_Pri = NewPriority;
  364.  
  365.    if ((node->ln_Type == NT_TASK) || (node->ln_Type == NT_PROCESS))
  366.       {
  367.       (void) SetTaskPri( (struct Task *) node, NewPriority );
  368.       // Throw away old priority.
  369.       }
  370.    else
  371.       {
  372.       Forbid();
  373.  
  374.          if (node->ln_Type == NT_INTERRUPT)
  375.             {
  376.             Disable();
  377.  
  378.                Remove( node );
  379.                Enqueue( &SysBase->IntrList, &savednode );
  380.  
  381.             Enable();
  382.             }
  383.          else
  384.             {
  385.             Remove( node );
  386.  
  387.             switch (node->ln_Type)
  388.                {
  389.                case NT_LIBRARY:
  390.                   Enqueue( &SysBase->LibList, &savednode );
  391.                   break;
  392.       
  393.                case NT_RESOURCE:
  394.                   Enqueue( &SysBase->ResourceList, &savednode );
  395.                   break;
  396.          
  397.                case NT_DEVICE:
  398.                   Enqueue( &SysBase->DeviceList, &savednode );
  399.                   break;
  400.  
  401.                case NT_MEMORY:
  402.                   Enqueue( &SysBase->MemList, &savednode );
  403.                   break;
  404.  
  405.                case NT_MSGPORT:
  406.                   Enqueue( &SysBase->PortList, &savednode );
  407.  
  408.                default:
  409.                   break;
  410.                }
  411.             }
  412.  
  413.       Permit(); 
  414.       }
  415.  
  416.    ClosePrWindow();
  417.    return( (int) FALSE );
  418. }
  419.  
  420. PRIVATE int CancelBtClicked( void )
  421. {
  422.    ClosePrWindow();
  423.    return( (int) FALSE );
  424. }
  425.  
  426. PRIVATE int PrVanillaKey( int whichkey )
  427. {
  428.    int rval = TRUE;
  429.  
  430.    switch (whichkey)
  431.       {
  432.       case 'c':
  433.       case 'C':
  434.       case 'x':
  435.       case 'X':
  436.       case 'q':
  437.       case 'Q':
  438.          rval = CancelBtClicked();
  439.          
  440.       default:
  441.          break;
  442.       }
  443.  
  444.    return( rval );
  445. }
  446.  
  447. // --------------------------------------------------------------
  448.  
  449. PRIVATE void PrRender( void )
  450. {
  451.    struct IntuiText it;
  452.  
  453.    ComputeFont( Scr, Font, &CFont, PrWidth, PrHeight );
  454.  
  455.  
  456.    CopyMem( (char *) PrIText, (char *) &it, 
  457.             (long) sizeof( struct IntuiText )
  458.           );
  459.  
  460.    it.ITextFont = Font;
  461.  
  462.    it.LeftEdge  = CFont.OffX + ComputeX( CFont.FontX, it.LeftEdge ) 
  463.                   - (IntuiTextLength( &it ) >> 1);
  464.  
  465.    it.TopEdge   = CFont.OffY + ComputeY( CFont.FontY, it.TopEdge ) 
  466.                   - (Font->ta_YSize >> 1);
  467.  
  468.    PrintIText( PrWnd->RPort, &it, 0, 0 );
  469.  
  470.    return;
  471. }
  472.  
  473. PRIVATE int OpenPrWindow( void )
  474. {
  475.    struct NewGadget  ng;
  476.    struct Gadget    *g;
  477.    UWORD             lc, tc;
  478.    UWORD             wleft = PrLeft, wtop = PrTop, ww, wh;
  479.  
  480.    ComputeFont( Scr, Font, &CFont, PrWidth, PrHeight );
  481.  
  482.    ww = ComputeX( CFont.FontX, PrWidth );
  483.    wh = ComputeY( CFont.FontY, PrHeight );
  484.  
  485.    if ((wleft + ww + CFont.OffX + Scr->WBorRight) > Scr->Width) 
  486.       wleft = Scr->Width - ww;
  487.    
  488.    if ((wtop + wh + CFont.OffY + Scr->WBorBottom) > Scr->Height) 
  489.       wtop = Scr->Height - wh;
  490.  
  491.    if ((PrFont = OpenDiskFont( Font )) == NULL)
  492.       return( -5 );
  493.  
  494.    if ((g = CreateContext( &PrGList )) == NULL)
  495.       return( -1 );
  496.  
  497.    for (lc = 0, tc = 0; lc < Pr_CNT; lc++) 
  498.       {
  499.       CopyMem( (char *) &PrNGad[ lc ], (char *) &ng, 
  500.                (long) sizeof( struct NewGadget )
  501.              );
  502.  
  503.       ng.ng_VisualInfo = VisualInfo;
  504.       ng.ng_TextAttr   = Font;
  505.  
  506.       ng.ng_LeftEdge   = CFont.OffX + ComputeX( CFont.FontX, 
  507.                                                 ng.ng_LeftEdge
  508.                                               );
  509.  
  510.       ng.ng_TopEdge    = CFont.OffY + ComputeY( CFont.FontY, 
  511.                                                 ng.ng_TopEdge
  512.                                               );
  513.  
  514.       ng.ng_Width      = ComputeX( CFont.FontX, ng.ng_Width );
  515.       ng.ng_Height     = ComputeY( CFont.FontY, ng.ng_Height);
  516.  
  517.       PrGadgets[ lc ] = g = CreateGadgetA( (ULONG) PrGTypes[ lc ], 
  518.                               g, 
  519.                               &ng, 
  520.                               (struct TagItem *) &PrGTags[ tc ] );
  521.  
  522.       while (PrGTags[ tc ] != NULL) 
  523.          tc += 2;
  524.       
  525.       tc++;
  526.  
  527.       if (g == NULL)
  528.          return( -2 );
  529.       }
  530.  
  531.    if ((PrWnd = OpenWindowTags( NULL,
  532.  
  533.             WA_Left,        wleft,
  534.             WA_Top,         wtop,
  535.             WA_Width,       ww + CFont.OffX + Scr->WBorRight,
  536.             WA_Height,      wh + CFont.OffY + Scr->WBorBottom,
  537.  
  538.             WA_IDCMP,       TEXTIDCMP | NUMBERIDCMP | INTEGERIDCMP
  539.               | BUTTONIDCMP | IDCMP_GADGETDOWN | IDCMP_VANILLAKEY
  540.               | IDCMP_REFRESHWINDOW,
  541.  
  542.             WA_Flags,       WFLG_DRAGBAR | WFLG_DEPTHGADGET 
  543.               | WFLG_SMART_REFRESH | WFLG_ACTIVATE | WFLG_RMBTRAP,
  544.  
  545.             WA_Gadgets,     PrGList,
  546.             WA_Title,       PrWdt,
  547.             WA_ScreenTitle, ScrTitle,
  548.             TAG_DONE )
  549.  
  550.       ) == NULL)
  551.       return( -4 );
  552.  
  553.    GT_RefreshWindow( PrWnd, NULL );
  554.  
  555.    PrRender();
  556.  
  557.    return( 0 );
  558. }
  559.  
  560. PRIVATE int HandlePrIDCMP( void )
  561. {
  562.    struct IntuiMessage *m;
  563.    int                (*func)( void );
  564.    BOOL                 running = TRUE;
  565.  
  566.    while (running == TRUE)
  567.       {
  568.       if ((m = GT_GetIMsg( PrWnd->UserPort )) == NULL) 
  569.          {
  570.          (void) Wait( 1L << PrWnd->UserPort->mp_SigBit );
  571.          continue;
  572.          }
  573.  
  574.       CopyMem( (char *) m, (char *) &PrMsg, 
  575.                (long) sizeof( struct IntuiMessage )
  576.              );
  577.  
  578.       GT_ReplyIMsg( m );
  579.  
  580.       switch (PrMsg.Class) 
  581.          {
  582.          case IDCMP_REFRESHWINDOW:
  583.             GT_BeginRefresh( PrWnd );
  584.             PrRender();
  585.             GT_EndRefresh( PrWnd, TRUE );
  586.             break;
  587.  
  588.          case IDCMP_VANILLAKEY:
  589.             running = PrVanillaKey( PrMsg.Code );
  590.             break;
  591.  
  592.          case IDCMP_GADGETUP:
  593.          case IDCMP_GADGETDOWN:
  594.             func = (void *) ((struct Gadget *)PrMsg.IAddress)->UserData;
  595.             if (func != NULL)
  596.                running = func();
  597.    
  598.             break;
  599.          }
  600.       }
  601.  
  602.    return( running );
  603. }
  604.  
  605. PUBLIC int ChangePriorityHandler( char *name, int ObjType, int frompri )
  606. {
  607.    int rval = 0;
  608.  
  609.    Object_Name = name;   
  610.    ObjectType  = ObjType;
  611.  
  612.    if (OpenPrWindow() < 0)
  613.       return( rval = -1 );
  614.  
  615.    SetNotifyWindow( PrWnd );
  616.  
  617.    GT_SetGadgetAttrs( PrGadgets[ FromPriNum ], PrWnd, NULL,
  618.                       GTNM_Number, frompri, TAG_DONE
  619.                     );
  620.  
  621.    GT_SetGadgetAttrs( PrGadgets[ ObjNameTxt ], PrWnd, NULL,
  622.                       GTTX_Text, (STRPTR) name, TAG_DONE
  623.                     );
  624.  
  625.    GT_RefreshWindow( PrWnd, NULL );
  626.  
  627.    PrRender();
  628.  
  629.    rval = HandlePrIDCMP();
  630.  
  631.    if (rval == FALSE)
  632.       rval = 0;
  633.                
  634.    return( rval );
  635. }
  636.  
  637. #ifdef DEBUG
  638.  
  639. PUBLIC int main( int argc, char **argv )
  640. {
  641.    int rval = 0;
  642.  
  643.    if (argc != 4)
  644.       {
  645.       fprintf( stderr, "USAGE:  %s objname objtype oldpri\n", argv[0] );
  646.       return( RETURN_ERROR );
  647.       }
  648.  
  649.    if (SetupSystemList( &OpenPrWindow ) < 0)
  650.       {
  651.       fprintf( stderr, "Couldn't setup %s!\n", argv[0] );
  652.       return( RETURN_FAIL );
  653.       }
  654.  
  655.    SetNotifyWindow( PrWnd );      
  656.  
  657.    rval = ChangePriorityHandler( argv[1],
  658.                                  atoi( argv[2] ),
  659.                                  atoi( argv[3] )
  660.                                );
  661.    ShutdownSystemList();   
  662.  
  663.    return( rval );
  664. }
  665.  
  666. #endif
  667.  
  668. /* ----------------- END of Priority.c file! ------------------- */
  669.